#include <iostream>
using namespace std;

/*
    模板:本质就是类型参数（可以表示返回值类型、参数类型）
        1.模板的语法：
            template <typename T>   声明一个模板参数，T为模板参数名称  
                                    template 是C++关键字，专门声明模板参数
                                    typename 是C++关键字，专门定义模板参数的名字
                                    typename 和 class 都可以定义模板参数
            T add(T a, T b)  模板函数 <-- 使用了模板作为返回值或者新城形参 
            {}
        2.模板函数的底层原理
            编译器会根据传递的实参类型，自动生成对应版本的函数
        3.声明多个模板参数 <-- template <typename T1, typename T2>
            T1 和 T2 的类型可以相同也可以不同
        4.auto 自动推导结果合适的类型
        5.可变参数 C++17支持
            template <typename... Ts>
            auto add(Ts... args)
            {
                return (args + ...);
            }
*/


template <typename T1 , typename T2>
auto add(T1 a, T2 b)
{
    cout << "模板函数 add()" << endl;
    return a + b;
}
// 可变模板 C++17支持
template <typename... Ts>
auto add(Ts... args)
{
    cout << "模板函数 add()" << endl;
    return (args + ...);
}



int main()
{
    int n1 = 78;
    int n2 = 93;
    double n3 = 56.98;
    double n4 = 13.39;

    int result1 = add(n1, n2);
    cout << result1 << endl;
    
    double result2 = add(n3, n4);
    cout << result2 << endl;

    double restult3 = add(n4, n1);
    cout << restult3 << endl;
    int result4 = add(n4, n1);
    cout << result4 << endl;

    cout << "----------------------------------------------------------------" << endl;
    int result5 = add(n1, n2, n3, n4);  
    cout << result5 << endl;


    return 0;
}